assert()宏通常在C++代码中用于检查程序执行过程中，是否存在某些特定条件。若断言失败，程序将停止运行，以便开发者修复问题。

C++11中引入的static\_assert关键字具有相同的目的，但会在编译时进行求值:若条件(必须是常量表达式)求值为false，编译器将发出错误消息。错误消息将包括一个字符串(它是static\_assert本身的一部分)，告诉开发者哪里出错了。下面的静态断言确保我们在一个带有64位指针的平台上编译:

\begin{lstlisting}[style=styleCXX]
static_assert(sizeof(void*) * CHAR_BIT == 64, "Not a 64-bit platform");
\end{lstlisting}

当模板参数不满足模板的约束时，静态断言可用于提供有用的错误消息。使用第19.4节描述的技术，可以创建一个类型特征来确定类型是否可解引用:

\hspace*{\fill} \\ %插入空行
\noindent
\textit{debugging/hasderef.hpp}
\begin{lstlisting}[style=styleCXX]
#include <utility> // for declval()
#include <type_traits> // for true_type and false_type

template<typename T>
class HasDereference {
	private:
	template<typename U> struct Identity;
	template<typename U> static std::true_type
		test(Identity<decltype(*std::declval<U>())>*);
	template<typename U> static std::false_type
		test(...);
	public:
	static constexpr bool value = decltype(test<T>(nullptr))::value;
};
\end{lstlisting}

可以在shell()中引入一个静态断言，若上一节中的shell()模板实例化时使用了不可解引用的类型，该断言会提供更好的诊断信息:

\begin{lstlisting}[style=styleCXX]
template<typename T>
void shell (T const& env)
{
	static_assert(HasDereference<T>::value, "T is not dereferenceable");
	typename T::Index i;
	middle(i);
}
\end{lstlisting}

通过这些更改，编译器会产生简单扼要的诊断信息，从而表明类型T不可解引用。

静态断言可以使错误消息更短、更简单，从而极大地改善使用模板库时的用户体验。

也可以将其应用于类模板，并使用附录D中的类型特征:

\begin{lstlisting}[style=styleCXX]
template<typename T>
class C {
	static_assert(HasDereference<T>::value, "T is not dereferenceable");
	static_assert(std::is_default_constructible<T>::value,
				  "T is not default constructible");
	...
};
\end{lstlisting}




































